home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / amiga.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  2KB  |  119 lines

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <sys/param.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <dirent.h>
  8.  
  9. __BEGIN_DECLS
  10. /**
  11.  * Provide wrappers for the stat, fopen, and opendir functions that massage
  12.  * the file names given to them as arguments so that UNIX "." and ".."
  13.  * path names are translated to their AmigaOS equivalents. This is done so
  14.  * that no intervention is done in terms of file semantics to the jikes
  15.  * source.
  16.  */
  17. static char buf[MAXPATHLEN+1];
  18. static char cwd[MAXPATHLEN+1];
  19. static char pathComponent[MAXPATHLEN+1];
  20.  
  21. static void ix_out(char *s)
  22. {
  23.   int ptr;
  24.  
  25.   if (strcmp(s, ".") == '\0') {
  26.     if (buf[0] == '\0') {
  27.       strcat(buf, cwd);
  28.     }else{
  29.       ptr = strlen(buf)-1;
  30.       if (buf[ptr] == '/') {
  31.         buf[ptr] = '\0';
  32.       }
  33.     }
  34.   }else{
  35.     if (strcmp(s, "..") != 0) {
  36.       strcat(buf, s);
  37.     }
  38.   }
  39. }
  40.  
  41. static char *
  42. ix_path(const char *path)
  43. {
  44.   int len;
  45.   char sep[2];
  46.   int appendSep, skipNext = 0;
  47.   int i, j;
  48.  
  49.   buf[0] = '\0';
  50.   cwd[0] = '\0';
  51.   pathComponent[0] = '\0';
  52.   sep[1] = '\0';
  53.   getcwd(cwd, sizeof(cwd));
  54.   len = strlen(path);
  55.  
  56.   for (i=0, j=0; i<len; i++) {
  57.     if (path[i] == '/' || path[i] == ':') {
  58.       pathComponent[j] = '\0';
  59.       if (j != 0) {
  60.         if (buf[0] != '\0' && strcmp(pathComponent, ".") == 0 &&
  61.         buf[strlen(buf)-1] == ':') {
  62.       appendSep = 0;
  63.     }else{
  64.       appendSep = 1;
  65.     }
  66.         ix_out(pathComponent);
  67.         j = 0;
  68.         pathComponent[0] = '\0';
  69.       }
  70.       sep[0] = path[i];
  71.       if (appendSep && !skipNext) {
  72.         strcat(buf, sep);
  73.       }
  74.       /* Constructs of the type FOO:/bar are *probably* caused by appending
  75.        * UNIX-style a path to a directory, so we skip the bogus "/".
  76.        */
  77.       if (path[i] == ':' && path[i+1] == '/') {
  78.         skipNext = 1;
  79.       }else{
  80.         skipNext = 0;
  81.       }
  82.     }else{
  83.       pathComponent[j++] = path[i];
  84.     }
  85.   }
  86.   if (j > 0) {
  87.     pathComponent[j] = '\0';
  88.     ix_out(pathComponent);
  89.   }
  90.   return buf;
  91. }
  92.  
  93. int
  94. mystat(const char *path, struct stat *sb)
  95. {
  96.   int status = stat(ix_path(path), sb);
  97.   return status;
  98. }
  99.  
  100. FILE *
  101. myfopen(char *path, char *mode)
  102. {
  103.   FILE *f = fopen(ix_path(path), mode);
  104.   return f;
  105. }
  106.  
  107. int
  108. myfclose(FILE *stream)
  109. {
  110.   int status = fclose(stream);
  111.   return status;
  112. }
  113.  
  114. DIR *myopendir(const char *path)
  115. {
  116.   return opendir(ix_path(path));
  117. }
  118. __END_DECLS
  119.